package com.share.module.sys.role.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.share.module.sys.menu.service.MenuService;
import com.share.module.sys.role.dao.RoleDAO;
import com.share.module.sys.role.entity.Role;
import com.share.module.sys.role.vo.RolePageQueryVO;
import com.share.module.sys.role.vo.RolePageVO;
import com.share.module.sys.rolemenu.dao.RoleMenuDAO;
import com.share.module.sys.rolemenu.entity.RoleMenu;
import com.stock.mybatisplus.utils.PageUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 角色表 服务实现类
 * </p>
 *
 * @author lijy
 * @since 2023-04-17
 */
@Service
public class RoleService extends ServiceImpl<RoleDAO, Role> {

    @Resource
    private RoleMenuDAO roleMenuDAO;

    @Resource
    private MenuService menuService;

    public PageUtils<RolePageVO> page(RolePageQueryVO pageQueryVO) {
        IPage<Role> page = super.page(new Page<>(pageQueryVO.getCurrPage(), pageQueryVO.getSize()), Wrappers.<Role>lambdaQuery()
                .like(Role::getName, pageQueryVO.getName())
                .orderByDesc(Role::getId));

        List<RolePageVO> targets = page.getRecords().stream().map(item -> {
            RolePageVO pageVO = new RolePageVO();
            pageVO.setId(item.getId());
            pageVO.setName(item.getName());
            pageVO.setDescription(item.getDescription());
            pageVO.setFlag(item.getFlag());
            return pageVO;
        }).collect(Collectors.toList());
        return new PageUtils<>(targets, page.getTotal(), pageQueryVO.getCurrPage(), pageQueryVO.getSize());
    }

    @Transactional(rollbackFor = Exception.class)
    public void setRoleMenu(Integer roleId, List<Integer> menuIds) {
        // 先删除当前角色id所有绑定关系
        roleMenuDAO.deleteByRoleId(roleId);

        // 再把前端传过来的菜单id数组绑到当前的这个角色id上去
//        List<Integer> menuIdsCopy = CollUtil.newArrayList(menuIds);
        for (Integer menuId : menuIds) {
//            Menu menu = menuService.getById(menuId);
            // 二级菜单 并且传过来的menuId数组里没有它的父级i d
//            if (!menuIdsCopy.contains(menu.getPid())) {
//                // 补上父级id
//                RoleMenu roleMenu = new RoleMenu();
//                roleMenu.setRoleId(roleId);
//                roleMenu.setMenuId(roleId);
//                roleMenuDAO.insert(roleMenu);
//
//                menuIdsCopy.add(menu.getPid());
//            }

            RoleMenu roleMenu = new RoleMenu();
            roleMenu.setRoleId(roleId);
            roleMenu.setMenuId(menuId);
            roleMenuDAO.insert(roleMenu);
        }
    }

    public List<Integer> getRoleMenu(Integer roleId) {
        return roleMenuDAO.selectByRoleId(roleId);
    }
}
